#ifndef __OLED_H
#define __OLED_H

#include "gd32f10x.h"
#include "bsp_i2c.h"

/* 参考手册：SSD1306（中景园电子0.96OLED显示屏_驱动芯片手册） */
#define OLED_SET_DISPLAY_OFF 0xAE       /* 关闭显示 */
#define OLED_SET_DISPLAY_ON 0xAF        /* 开启显示 */
#define OLED_SET_NORMAL_INVERSE_DISPLAY 0xA6    /* 设置一次为正常显示，再设置为倒转显示 */
#define OLED_SET_MULTPLEX_RATIO 0xA8    /* 设置多用复用率 */
#define OLED_SET_DISPLAY_OFF_SET 0xD3   /* 设置显示偏移 */
#define OLED_SET_COM_PIN_CONF   0xDA    /* 设置COM引脚硬件配置 */
#define OLED_SET_VCOMNH_DESELECT 0xDB   /* 设置VCOMH取消选择级别 */
#define OLED_SET_ENTIRE_DISPLAY_ON 0xA4     /* 设置整个显示打开 */
#define OLED_SET_ENTIRE_DISPLAY_OFF 0xA5    /* 设置整个显示关闭 */ 
#define OLED_SET_PRECHARGE_PERIOD 0xD9  /* 设置预充电周期 */
#define OLED_SET_DISPLAY_START_LINE 0x40   /* 设置显示开始行（从Row0开始) */
#define OLED_SET_CONTRAST_CONTROL   0x81 /* 设置对比度控制 */
#define OLED_SET_DISPLAY_CLOCK_DIV  0xD5    /* 设置显示时钟分频比/振荡器频率 */



/**
 * Note: OLED的Page地址模式下，从高到低分为Page0-Page7 7个行，从左到右分为COL0-COL127 127个列
 * 列号高四位和低四位分别有专门的设置
 */
#define OLED_SET_PAGE_START_ADDR    0xB0    /* 设置行（页）起始地址(从Page0开始) */
#define OLED_SET_COLUMN_START_ADDR_H 0x10   /* 设置列号高四位 */ 
#define OLED_SET_COLUMN_START_ADDR_L 0x00   /* 设置列号低四位 */

#define OLED_I2C_ADDR      0x78
#define OLED_I2C_CMD_ADDR  0x00
#define OLED_I2C_DATA_ADDR 0x40

#define MAX_COLUMN 132

typedef enum {
    kcharsize_6x8 = 8,
    kcharsize_8x16 = 16
} oled_char_size_table;

void i2c_write_byte(uint8_t i2c_addr, uint8_t i2c_data);

uint8_t oled_8x16_col_to_x(uint8_t col);
uint8_t oled_8x16_line_to_y(uint8_t row);

void oled_write_command(uint8_t oled_cmd); 
void oled_write_data(uint8_t oled_data); 

void oled_init(void);

void oled_display_white(void);							// OLED 白屏显示
void oled_clear_all(void);								// OLED 清屏显示
void oled_fill(uint8_t fill_data);                      // 单一色度填充OLED屏


void oled_show_chinese(uint8_t line, uint8_t column, uint8_t index);                  // 显示中文	
void oled_show_error(uint8_t line, uint8_t column, uint8_t *err);                    // 显示错误提示
uint32_t oled_pow(uint32_t x, uint32_t y);

/* oled设置光标，显示各种数据类型，操作单元是计算过的画布格子（根据画布大小计算成对应的坐标） */

void oled_set_cursor(uint8_t line, uint8_t column);
void oled_set_char_size(uint8_t char_size);
void oled_show_char(uint8_t line, uint8_t column, uint8_t ch);
void oled_show_string(uint8_t line, uint8_t column, char *str);
void oled_show_num(uint8_t line, uint8_t column, uint32_t num, uint8_t len);
void oled_show_signed_num(uint8_t line, uint8_t column, int32_t num, uint8_t len);
void oled_show_hex_num(uint8_t line, uint8_t column, uint32_t num, uint8_t len);
void oled_show_bin_num(uint8_t line, uint8_t column, uint32_t number, uint8_t length);





#endif
